#ifndef SUBBANDTABLEMODEL_H
#define SUBBANDTABLEMODEL_H

#include <QAbstractTableModel>
#include <QVector>
#include <QSharedPointer>
#include <QString>
#include <QtGlobal>
#include "common/datatypes.h"

class SubBandTableModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    /**
     * @brief SubBandTableModel::SubBandTableModel
     * @details 构造子区间表模型并绑定父对象。
     * @param parent Qt 父对象。
     */
    explicit SubBandTableModel(QObject *parent = nullptr)
        : QAbstractTableModel(parent)
    {
    }

    enum Col {
        COL_ID = 0,
        COL_HW_ID,
        COL_F_START_MHZ,
        COL_F_STOP_MHZ,
        COL_STEP_MHZ,
        COL_DWELL_MS,
        COL_PLAN,
        COL_FREQ_TABLE_ID,
        COL_IMM_SRC,
        COL_IMM_TABLE_ID,
        COL_IMM_VALUE,
        COL_TOL_UP_DB,
        COL_TOL_LO_DB,
        COL_MOD,
        COL_COUNT
    };

    /**
     * @brief SubBandTableModel::setSubBands
     * @details 重置模型并加载新的子区间数组。
     * @param rows 子区间指针集合。
     */
    void setSubBands(const QVector<TestSubBandPtr> &rows);
    /**
     * @brief SubBandTableModel::appendExisting
     * @details 追加一个子区间记录到模型末尾。
     * @param sb 子区间指针。
     */
    void appendExisting(const TestSubBandPtr &sb);
    /**
     * @brief SubBandTableModel::removeRows
     * @details 删除指定行范围内的子区间。
     * @param row 起始行索引。
     * @param count 删除行数。
     * @param parent 父索引，默认空。
     * @return 成功返回 true。
     */
    bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;

    // 通知整行更新（右侧编辑回写后调用）
    /**
     * @brief SubBandTableModel::notifyRowChanged
     * @details 通知视图指定行已更新。
     * @param r 行索引。
     */
    void notifyRowChanged(int r);

    // 访问器
    /**
     * @brief SubBandTableModel::rows
     * @details 获取全部子区间数据。
     * @return 子区间指针常量引用。
     */
    const QVector<TestSubBandPtr> &rows() const { return m_rows; }
    /**
     * @brief SubBandTableModel::rowPtr
     * @details 返回指定行的子区间指针。
     * @param r 行索引。
     * @return 子区间指针，越界时为空。
     */
    TestSubBandPtr rowPtr(int r) const
    {
        return (r >= 0 && r < m_rows.size()) ? m_rows[r] : TestSubBandPtr {};
    }

    // 基本实现
    /**
     * @brief SubBandTableModel::rowCount
     * @details 返回模型行数。
     * @param parent 父索引。
     * @return 行数量。
     */
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    /**
     * @brief SubBandTableModel::columnCount
     * @details 返回模型列数。
     * @param parent 父索引。
     * @return 列数量。
     */
    int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    /**
     * @brief SubBandTableModel::headerData
     * @details 提供表头文字或对齐信息。
     * @param section 列索引。
     * @param o 表头方向。
     * @param role 数据角色。
     * @return 表头数据。
     */
    QVariant headerData(int section, Qt::Orientation o, int role) const override;
    /**
     * @brief SubBandTableModel::data
     * @details 返回单元格显示或属性值。
     * @param idx 模型索引。
     * @param role 数据角色。
     * @return 单元格数据。
     */
    QVariant data(const QModelIndex &idx, int role) const override;
    /**
     * @brief SubBandTableModel::flags
     * @details 返回单元格标志位。
     * @param idx 模型索引。
     * @return 项标志。
     */
    Qt::ItemFlags flags(const QModelIndex &idx) const override;

    // 枚举转字符串（供 UI 快速使用）
    /**
     * @brief SubBandTableModel::planToString
     * @details 频率计划枚举转字符串。
     * @param p 频率计划类型。
     * @return 对应文本。
     */
    static QString planToString(FrequencyPlanType p);
    /**
     * @brief SubBandTableModel::immSrcToString
     * @details 抗扰度来源枚举转字符串。
     * @param t 抗扰来源类型。
     * @return 对应文本。
     */
    static QString immSrcToString(ImmunityLevelType t);
    /**
     * @brief SubBandTableModel::modToString
     * @details 调制类型枚举转字符串。
     * @param m 调制类型。
     * @return 对应文本。
     */
    static QString modToString(GeneratorModulationType m);

private:
    QVector<TestSubBandPtr> m_rows;
};

#endif // SUBBANDTABLEMODEL_H
